/** 
 * @addtogroup hft
 * hft
 * @brief 下线检测组件接口
 * 
 * 本组件接口提供下线检测功能，组件内部完成协议数据的读写，并调用用户注册的列表完成应用数据组包。
 * 如果用户不实现收发数据接口，需要用户自行收发数据，解码和编码协议调用本组件完成。
 * 
 * @code{c}
 * THftSessionComp g_hft_comp_; // 会话组件
 * TMfSerialVirBus g_hft_vbs_; // 串口总线
 * THftMsgMgr      g_msg_mgr;  // 消息管理器
 * UInt8           rbuf[1024]; // 接收缓存
 * UInt8           sbuf[1024]; // 发送缓存
 * 
 * TMfSerialVirBusCreate(&g_hft_vbs_);
 * 
 * THftCmdQuery g_query_; // 查询功能
 * THftCmdCtrl  g_ctrl_;  // 控制功能
 * THftUserData g_user_data_; // 用户数据，比如检测上下文，上一个检测项目执行状态等
 * 
 * // 查询设备ID
 * Int32 THftCmdQueryDevId(void *sender, THtpQueryAckBody *ack_body)
 * {
 *     Int32 result = 0;
 *     ack_body->ack_result = PdkGetDevId(); //如果有读取失败，需要判断
 *     return reuslt;
 * }
 * // 查询支持列表
 * THftCmdQueryServiceType service_tbl[] =  {
 *     {kHtpQueryDevId,    &g_user_data_, THftCmdQueryDevId},
 * }
 * 
 * // 创建查询
 * THftCmdQueryCreate(&g_query_, service_tbl, sizeof(service_tbl)/sizeof(service_tbl[0]));
 * 
 * // 控制设备继电器1
 * Int32 THftCmdCtrlRelay1(void *sender, THtpQueryAckBody *ack_body)
 * {
 *     Int32 result = 0;
 *      
 *     if (ack_body->param1)
 *          ;// 执行机构
 * 
 *     return reuslt;
 * }
 * 
 * // 控制支持列表
 * THftCmdCtrlServiceType service_tb2[] = {
 *     {kHtpCtrlRelay1,  &g_user_data_, THftCmdCtrlRelay1},
 * }
 * 
 * // 创建控制
 * THftCmdCtrlCreate(&g_query_, service_tb2, sizeof(service_tb2)/sizeof(service_tb2[0]));
 * 
 * // 创建消息管理器
 * THftMsgMgrCreate(&g_msg_mgr);
 * 
 * // 关联查询功能
 * THftMsgMgrSetQuery(&mgr, &g_query_, THftCmdQueryProc);
 * 
 * // 关联控制功能
 * THftMsgMgrSetCtrl(&mgr, &g_ctrl_, THftCmdCtrlProc);
 * 
 * // 关联广播功能
 * THftMsgMgrSetBroadcast(&mgr, &g_broadcast_, TUserBroadcastProc); .// 扩展支持命令
 * 
 * // 创建组件
 * THftSessionCompCreate(&g_hft_comp_, &g_hft_vbs_, &g_msg_mgr, rbuf, sizeof(rbuf), tbuf, sizeof(tbuf));
 * 
 * // 用一个定时器定时调用
 * THftSessionCompRunonce(&g_hft_comp_);
 * 
 * @endcode
 * 
 * @{
 * @file         hft_session_comp.h
 * @brief        下线检测会话组件
 * @note    
 * @author       lixinliang
 * @date         2020-08-23
 * @version      1.0
 *
 * @par          修改日志
 * <table>
 * <tr><th>Date        <th>Version               <th>Author          <th>Description
 * <tr><td>2020-08-23  <td>1.0                   <td>lixinliang      <td>创建初始版本
 * @copyright    杭州鸿泉物联网技术股份有限公司
 */

#ifndef _HFT_SESSION_COMP_H_
#define _HFT_SESSION_COMP_H_

#include "hft/hft_session_interface.h"
#include "mfc/mfc_serial_vir_bus.h"

#include "hft/hft_msg_mgr.h"

#ifdef __cplusplus
extern "C" {
#endif
    
/**
 * 数据接收事件
 * 用作告知接收到的数据内容，可用作打印日志
 * @param sender: 发起者
 * @param buf: 接收到的数据缓存
 * @param size: 数据缓存长度
 * @return
 */
typedef void (*THftSessionCompDoRecvEvent)(void *sender, const Byte *buf, Int32 size);

/**
 * 接收事件
 */
typedef struct THftSessionCompOnRecvEventTag THftSessionCompOnRecvEvent;
struct THftSessionCompOnRecvEventTag
{
    void *object; ///< 对象指针
    THftSessionCompDoRecvEvent  Method;   ///< 方法
};

/**
 * 下线检测组件
 */
typedef struct THftSessionCompTag THftSessionComp;
struct THftSessionCompTag
{
PROTECTED
    IHftSession session_if_;       ///< 会话接口
    
PRIVATE
    TMfSerialVirBus *serial_vbus_; ///< 串口总线
    THftMsgMgr      *msg_mgr_;     ///< 消息管理器
    
    Int32 recv_size_;       ///< 接收缓存中的数据长度     
    Byte  *recv_buf_;       ///< 接收缓存
    Int32 recv_buf_size_;   ///< 接收缓存尺寸
    
    Int32 send_size_;       ///< 发送缓存中数据的长度
    Byte  *send_buf_;       ///< 发送缓存
    Int32 send_buf_size_;   ///< 发送缓存尺寸
    
PRIVATE
    THftSessionCompOnRecvEvent OnRecvEvent;        ///< 接收消息事件[如通知打印日志]
};

/**
 * 构造函数
 * @param self: 对象指针
 * @param vbus: 总线对象
 * @param r_buf: 接收缓存
 * @param r_buf_size: 接收缓存尺寸
 * @param s_buf: 发送缓存
 * @param s_buf_size: 发送缓存尺寸
 * @return
 */
void THftSessionCompCreate(THftSessionComp *self, TMfSerialVirBus *vbus, THftMsgMgr *mgr,
    Byte *r_buf, Int32 r_buf_size,
    Byte *s_buf, Int32 s_buf_size);

/**
 * 设置事件
 * @param self: 对象指针
 * @return 
 */
void THftSessionCompSetOnRecvEvent(THftSessionComp *self, 
    void *object, THftSessionCompDoRecvEvent method);

/**
 * 析构函数
 * @param self: 对象指针
 * @return 
 */
void THftSessionCompDestroy(THftSessionComp *self);

/**
 * 获取消息管理对象
 * @param self: 对象指针
 * @return 消息管理器对象
 */
THftMsgMgr *THftSessionCompHftMsgMgr(THftSessionComp *self);

/**
 * 获取会话接口对象
 * @param self: 对象指针
 * @return 会话对象
 */
IHftSession *THftSessionCompIHftSession(THftSessionComp *self);

/**
 * 发送数据接口
 * @param self: 对象指针
 * @param buf: 发送数据缓存
 * @param size: 发送数据长度
 * @return -1: 发送数据失败 >=0:实际发送数据长度
 */
Int32 THftSessionCompSend(THftSessionComp *self, const UInt8 *buf, Int32 size);

/**
 * 填充解析数据
 * @param self: 对象指针
 * @param buf:  外部数据流缓存
 * @param size: 数据长度
 * @return -1: 数据失败 >=0:实际解析的数据长度
 */
void THftSessionCompProcessDataStream(THftSessionComp *self, const UInt8 *buf, Int32 size);

/**
 * 循环调度函数
 * @param self: 对象指针
 * @return 
 */
void THftSessionCompRunonce(THftSessionComp *self);

#ifdef __cplusplus
}
#endif

#endif // _HFT_SESSION_COMP_H_

/** @} */
